import {getUnReadMsg} from './chat.js';
import {hostIp,hostPort} from '../../api/api.js';
import {formatTime}  from '../utils/util.js';
// let hostIp = "192.168.0.111:";
// let hostPort = '9200';
let userSocket;//socket 对象
let heartFlag;//重连定时器的标志,如果超时没有回复，那么会重连
export function mOpenSocket(globalData,merchantId){
  //let globalData = that.globalData;
  console.log(globalData,"test")
  //globalstatus
  //可以反复调用这个方法，因为即使你调用了这个方法如果是链接成功，那么会自动中断，
  //如果第一次调用的时候链接出错，那么第二次依然可以调用，
  //第一次链接出错之后不会停止，他会反复的重连。所以可以给他设置一个反复重连的次数
  //或者是设置只链接一次的方法，然后如果链接失败他自己会反复的重连。
  if(globalData.mSocketStatus == "closed"){
      //只要链接过一次，就要把falg设置为false，下次就不会再次链接了。
      globalData.mSocketFlag = false;
      userSocket = wx.connectSocket({
        url:"ws://"+hostIp+":"+hostPort+`/merchant/${merchantId}`,
      })
  }else{
      console.log("%c 重连失败，因为全局标志为connected ，意思是链接已经存在，只有userSocketStatus == “closed” 的时候才会重连","color:green;font-size:20px;")
  }


  //监听链接事件
  userSocket.onOpen(res=>{
      console.log(res,"用户已经链接聊天服务器");
      console.log("%c服务器已经链接...","color:green;font-size:20px;")
      globalData.mSocketStatus = 'connected';
      //链接之后发送心跳包
      sendHeart();
  })

  
  //监听断开事件
  userSocket.onClose(res=>{
       console.log(res,"用户已经断开聊天服务器");
       console.log("%c用户已经断开聊天服务器...","color:green;font-size:20px;")
       globalData.mSocketStatus = 'closed';
      //  openSocket(globalData);
      connectAgaiin()
  })


  //监听链接出错
  userSocket.onError(res=>{
       console.log(res,"用户链接出错");
       console.log("%c用户链接出错...","color:green;font-size:20px;")
  })

  //监听服务器推送的消息------------------

  /**
   * 0 
   *   1）播放声音
   *   2）如果是从
   * 
   * 
   * 接收消息的逻辑
   * 1 在和发送消息的人聊天
   *   1）调用chat 页面的方法渲染页面
   * 2 在聊天页面但是不是和发送该消息的人聊天
   *   2）刷新tabbar
   * 3 在列表页面
   *   1）刷新 列表未读消息数，
   *   2）刷新tabbar 未读消息数
   * 4 在其他页面
   *   1）弹窗
   *   2）刷新tabbar未读消息数
   * 
   * 
   * 
  //  * --------已读消息处理--------------
   *  1 如果是在当前的页面，每次接收到一条消息都要标志为已读
      2 每次进入页面的时候都要把当前的聊天对象的信息标志为已读
      3 每次退出聊天页面的时候都要更新tabbar
   *  

   ------------tabbar消息的处理-----------------------------
     只要是在聊天页面就不需要处理tabbar和未读消息。
   * 
   * **/ 
  userSocket.onMessage(res=>{
      let msg = JSON.parse(res.data);
      
      if(msg.type&&msg.type == "heart"){
         console.log("%c 【接收到心跳包】：","color:green;font-size:20px;",res); 
         //清除定时器,不需要重连
         clearTimeout(heartFlag); 
         //接收到消息发送   
         setTimeout(() => {
             sendHeart();
         },10000);
         return;
      }
      //播放音乐
      playMusic();
     
      //震动
      wx.vibrateShort();
      console.log("%c 【商家接收到消息】：","color:green;font-size:20px;",msg); 
      // console.log(msg,"接收到的消息-------------------------");
      //推送过来的消息是实时消息，所以可以不使用服务端的时间
      // 可以自己new 一个时间出来
      let  date=new Date();
      date=formatTime(date);
      //给后面添加三个字符
      //给前面减去一个字符
      //解析数据格式
      let msg1={
         chatTime:date,
         content:msg.content,
         initiator:msg.initiator,
         mname:msg.mName,
         merchantId:msg.merchantId,
         openId:msg.openId,
         uName:msg.uName,
         uHeadImage:msg.uHeadImage,
      }
      //除了接收到聊天的人的信息以外，所有的情况都需要改变brgda
      // console.log("解析过的数据",msg1);
      //根据路由，判断当前用户所处的页面
      let pages = getCurrentPages();
      let currentPage = pages[pages.length-1];
      console.log(currentPage);
      if(currentPage.route == "pages/bgChat/chat"){
          //在聊天页面
          //如果是正在和发送消息的人聊天，渲染页面
          //如果是和另外的人聊天，弹出提示
          currentPage.receivedMsg(msg1);
          console.log("%c 聊天页面","color:green;font-size:20px;"); 
      }else if(currentPage.route == "pages/bgChatList/chatList"){
          //在列表页面
          console.log("%c 列表页面","color:green;font-size:20px;"); 
          //相当于刷新列表
          console.log()
          currentPage.getListW();
          // 不需要重新getlist 
          // setBadge();
          console.log()
      }else{
          //在其他页面
          console.log("%c 其他页面","color:green;font-size:20px;"); 
          //1 更改标志
          // setBadge();
          //2 弹出提示框
          showMsg(msg1)

      }
  })
 }//----opensocket 方法结束

 

// 弹出消息提示框
function showMsg(msg){
  let content = JSON.parse(msg.content);
  console.log(content,"content");
  if(content.type == "text"){
      wx.showToast({
        title:`${msg.uName}：【消息】`,   
        image:"../../images1/timg.png",
        duration:3000
      })

  }else{
      //图片
      wx.showToast({
        title:`${msg.uName}：【图片】`,  
        image:"../../images1/timg.png",
        duration:3000
      })

  }
 }

//播放音乐
function playMusic(){
  const innerAudioContext = wx.createInnerAudioContext()
  innerAudioContext.autoplay = true
  innerAudioContext.src = 'pages/utils/music/recived.mp3'
 
}
   
//主动断开链接的方法
export function closeSocket(){
   if(globalData.mSocketStatus === 'connected'){
     wx.closeSocket({
       success:() => {
          globalData.mSocketStatus = 'closed';
          console.log("链接已经关闭....")
          console.log("%c链接已经关闭.....","color:green;font-size:20px;")
       }
     })
   }else{
        console.log("链接不存在，之前已经断开了");
        console.log("%c链接不存在，之前已经断开了","color:green;font-size:20px;")
   }
}




/**
 * 
data	string/ArrayBuffer		是	需要发送的内容
success	function		否	接口调用成功的回调函数
fail	function		否	接口调用失败的回调函数
complete	function		否	接口调用结束的回调函数（调用成功、失败都会执行）
 * 
 * **/ 
   
//发送消息函数
export function sendMsg(msg){
   //console.log(getApp().globalData,"-------------")
   if (getApp().globalData.mSocketStatus === 'connected') {
       //自定义的发给后台识别的参数 ，我这里发送的是name
       userSocket.send({
          data:JSON.stringify(msg)  
       },res=>{
          console.log("========================消息发送成功",res)
       })
   }else{
      //重新链接
       console.log("%c已经断开链接","color:green;font-size:20px;")
   }
}

/**
   心跳思路：
   1 链接成功回调中发送一个心跳包
   2 何止定时器，如果超时未清除，那么重新连接
   3 接收到消息清除定时器，
   4 定时器10s 后再次调用 放心跳消息 
   5 递归循环
   

   注意：接收到消息之后才会发送下一个消息
 *      重连之后也会自动调用sendheart
 * 
 * 
 * **/ 

function sendHeart(){
    
     //2 发送心跳
     let msg= {
         type:"heart", 
         msg:new Date().getTime()
     }
    //发送给服务端 
    // 发送心跳包的前提是没有触发前端的断开和错误事件，send 方法可以正常使用。
    // 如果已经断开了，那么直接发送不了信息，会触发重连机制
  if (getApp().globalData.mSocketStatus === 'connected') {
      //自定义的发给后台识别的参数 ，我这里发送的是name
      userSocket.send({
         data:JSON.stringify(msg)  
      })
      console.log("%c 【心跳包已经发送】.....","color:green;font-size:20px;");
      heartFlag = setTimeout(() => {
          console.log("%c心跳超时....正在重新连接","color:green;font-size:20px;")
          // 超时说明链接断开
          getApp().globalData.mSocketStatus = "closed";
          connectAgaiin()
      },5000);

  }else{
     //重新链接
      console.log("%c心跳检测已经断开....正在重新连接","color:green;font-size:20px;");
      connectAgaiin();
  }

}



/**
 *      重连机制思路
 * 1 opensocket 
 *   1.1链接成功
 *     1.1.1 发送心跳
 *          1）发送成功，接收到心跳
 *             继续发送心跳，递归循环
 *          2）超时未接收到心跳
 *             -->调用openSocket 从头再来
 *     
 *             
 *   1.2连接失败 --> 触发错误回调 -->调用connetAgain-->10s 后调用openSocket
 *      1.2.1  链接成功..回到1.1.1
 *      1.2.2  链接失败  回到 1.2
 * 
 * ***/ 


function connectAgaiin(){
     console.log("%c 调用重连方法","color:green;font-size:20px;")
     setTimeout(() => {
      //重连的时候从本地获取merchantid，
      let merchantId = wx.getStorageSync('merchantLoginInfo').id
      // console.log("本地商家id--------------------------",merchantId);
      mOpenSocket(getApp().globalData,merchantId)
     },5000);
}






